home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / clockchips.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  4.2 KB  |  145 lines

  1. /*  linux/include/linux/clockchips.h
  2.  *
  3.  *  This file contains the structure definitions for clockchips.
  4.  *
  5.  *  If you are not a clockchip, or the time of day code, you should
  6.  *  not be including this file!
  7.  */
  8. #ifndef _LINUX_CLOCKCHIPS_H
  9. #define _LINUX_CLOCKCHIPS_H
  10.  
  11. #ifdef CONFIG_GENERIC_CLOCKEVENTS_BUILD
  12.  
  13. #include <linux/clocksource.h>
  14. #include <linux/cpumask.h>
  15. #include <linux/ktime.h>
  16. #include <linux/notifier.h>
  17.  
  18. struct clock_event_device;
  19.  
  20. /* Clock event mode commands */
  21. enum clock_event_mode {
  22.     CLOCK_EVT_MODE_UNUSED = 0,
  23.     CLOCK_EVT_MODE_SHUTDOWN,
  24.     CLOCK_EVT_MODE_PERIODIC,
  25.     CLOCK_EVT_MODE_ONESHOT,
  26.     CLOCK_EVT_MODE_RESUME,
  27. };
  28.  
  29. /* Clock event notification values */
  30. enum clock_event_nofitiers {
  31.     CLOCK_EVT_NOTIFY_ADD,
  32.     CLOCK_EVT_NOTIFY_BROADCAST_ON,
  33.     CLOCK_EVT_NOTIFY_BROADCAST_OFF,
  34.     CLOCK_EVT_NOTIFY_BROADCAST_FORCE,
  35.     CLOCK_EVT_NOTIFY_BROADCAST_ENTER,
  36.     CLOCK_EVT_NOTIFY_BROADCAST_EXIT,
  37.     CLOCK_EVT_NOTIFY_SUSPEND,
  38.     CLOCK_EVT_NOTIFY_RESUME,
  39.     CLOCK_EVT_NOTIFY_CPU_DEAD,
  40. };
  41.  
  42. /*
  43.  * Clock event features
  44.  */
  45. #define CLOCK_EVT_FEAT_PERIODIC        0x000001
  46. #define CLOCK_EVT_FEAT_ONESHOT        0x000002
  47. /*
  48.  * x86(64) specific misfeatures:
  49.  *
  50.  * - Clockevent source stops in C3 State and needs broadcast support.
  51.  * - Local APIC timer is used as a dummy device.
  52.  */
  53. #define CLOCK_EVT_FEAT_C3STOP        0x000004
  54. #define CLOCK_EVT_FEAT_DUMMY        0x000008
  55.  
  56. /**
  57.  * struct clock_event_device - clock event device descriptor
  58.  * @name:        ptr to clock event name
  59.  * @features:        features
  60.  * @max_delta_ns:    maximum delta value in ns
  61.  * @min_delta_ns:    minimum delta value in ns
  62.  * @mult:        nanosecond to cycles multiplier
  63.  * @shift:        nanoseconds to cycles divisor (power of two)
  64.  * @rating:        variable to rate clock event devices
  65.  * @irq:        IRQ number (only for non CPU local devices)
  66.  * @cpumask:        cpumask to indicate for which CPUs this device works
  67.  * @set_next_event:    set next event function
  68.  * @set_mode:        set mode function
  69.  * @event_handler:    Assigned by the framework to be called by the low
  70.  *            level handler of the event source
  71.  * @broadcast:        function to broadcast events
  72.  * @list:        list head for the management code
  73.  * @mode:        operating mode assigned by the management code
  74.  * @next_event:        local storage for the next event in oneshot mode
  75.  */
  76. struct clock_event_device {
  77.     const char        *name;
  78.     unsigned int        features;
  79.     unsigned long        max_delta_ns;
  80.     unsigned long        min_delta_ns;
  81.     unsigned long        mult;
  82.     int            shift;
  83.     int            rating;
  84.     int            irq;
  85.     cpumask_t        cpumask;
  86.     int            (*set_next_event)(unsigned long evt,
  87.                           struct clock_event_device *);
  88.     void            (*set_mode)(enum clock_event_mode mode,
  89.                         struct clock_event_device *);
  90.     void            (*event_handler)(struct clock_event_device *);
  91.     void            (*broadcast)(cpumask_t mask);
  92.     struct list_head    list;
  93.     enum clock_event_mode    mode;
  94.     ktime_t            next_event;
  95. };
  96.  
  97. /*
  98.  * Calculate a multiplication factor for scaled math, which is used to convert
  99.  * nanoseconds based values to clock ticks:
  100.  *
  101.  * clock_ticks = (nanoseconds * factor) >> shift.
  102.  *
  103.  * div_sc is the rearranged equation to calculate a factor from a given clock
  104.  * ticks / nanoseconds ratio:
  105.  *
  106.  * factor = (clock_ticks << shift) / nanoseconds
  107.  */
  108. static inline unsigned long div_sc(unsigned long ticks, unsigned long nsec,
  109.                    int shift)
  110. {
  111.     uint64_t tmp = ((uint64_t)ticks) << shift;
  112.  
  113.     do_div(tmp, nsec);
  114.     return (unsigned long) tmp;
  115. }
  116.  
  117. /* Clock event layer functions */
  118. extern unsigned long clockevent_delta2ns(unsigned long latch,
  119.                      struct clock_event_device *evt);
  120. extern void clockevents_register_device(struct clock_event_device *dev);
  121.  
  122. extern void clockevents_exchange_device(struct clock_event_device *old,
  123.                     struct clock_event_device *new);
  124. extern void clockevents_set_mode(struct clock_event_device *dev,
  125.                  enum clock_event_mode mode);
  126. extern int clockevents_register_notifier(struct notifier_block *nb);
  127. extern int clockevents_program_event(struct clock_event_device *dev,
  128.                      ktime_t expires, ktime_t now);
  129.  
  130. extern void clockevents_handle_noop(struct clock_event_device *dev);
  131.  
  132. #ifdef CONFIG_GENERIC_CLOCKEVENTS
  133. extern void clockevents_notify(unsigned long reason, void *arg);
  134. #else
  135. # define clockevents_notify(reason, arg) do { } while (0)
  136. #endif
  137.  
  138. #else /* CONFIG_GENERIC_CLOCKEVENTS_BUILD */
  139.  
  140. #define clockevents_notify(reason, arg) do { } while (0)
  141.  
  142. #endif
  143.  
  144. #endif
  145.